iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0

上一篇概述了 Semantic Kernel 的核心組成,本篇將更深入探討 Kernel 的使用,並透過一個入門範例來展示如何進行設定與操作。本範例著重於展示一個簡單的對話回合,幫助大家理解如何開始使用 Semantic Kernel 以及基本的 Kernel 配置。因此,此處不會涉及長短期記憶、Plugins、Agents等進階主題,這些內容將在後續章節中逐步介紹。

範例應用配置說明

  • 使用.NET 8.0 主控台應用
  • 使用Azure OpenAI建立 GPT-4o-mini 模型服務(或是 OpenAI GPT-4o-mini)

Let's Go

  • 透過 Nuget 安裝 Semantic Kernel
    在 NuGet 中,你可以找到多個與 Semantic Kernel 相關的套件包,其中 Microsoft.SemanticKernel 是一個較大的整合套件包,包含了許多其他相關的套件,例如 OpenAI、Azure OpenAI、DALL-E 等等。而另一個套件 Microsoft.SemanticKernel.Core,顧名思義,只包含最核心的部分,其它功能則可以根據需求手動安裝。我們在這裡直接選擇安裝 Microsoft.SemanticKernel 套件。目前最新版本為 1.19.0。
dotnet add package Microsoft.SemanticKernel --version 1.19.0
  • 建立 Kernel 物件 (OpenAI)
    Semantic Kernel 內建支援與 OpenAI 連接,因此在程式碼中,只需在建立 Kernel 物件時,配置 AddOpenAIChatCompletion 方法,並提供 apiKey 和 modelId 參數,就能輕鬆與 OpenAI 服務連接。modelId 參數可依據需求從OpenAI 官方頁面(https://platform.openai.com/docs/models)查閱,選擇適合的模型進行配置。
Kernel kernel = Kernel.CreateBuilder()
            .AddOpenAIChatCompletion(
                modelId: openai_modelId,
                apiKey: openai_apiKey)
            .Build();
  • 建立 Kernel 物件 (Azure OpenAI)
    如果使用 Azure OpenAI,則在建立 Kernel 物件時,需要改用 AddAzureOpenAIChatCompletion 方法。這個方法同樣是 Semantic Kernel 內建的,包含三個必要的參數:服務端點、部署名稱以及 apiKey。這些資訊可以從 Azure OpenAI Studio 上取得。需要特別注意的是"部署名稱"並不是指模型的名稱,而是你在部署模型時所設定的名稱。
Kernel kernel = Kernel.CreateBuilder()
            .AddAzureOpenAIChatCompletion(
                endpoint: aoai_endpoint,
                deploymentName: aoai_deployment,
                apiKey: aoai_apiKey)
            .Build();
  • 開始對話(無對話歷史記憶)
    要開始與LLMs交談,只需要簡單一行程式碼即可,這裡先不談對話歷史記憶的機制(後續文章再來介紹)。
Console.WriteLine(await kernel.InvokePromptAsync("世界最大的動物是什麼?"));

輸出的結果:
世界上最大的動物是藍鯨(Balaenoptera musculus)。藍鯨可以長達30米(約98英尺)或更長,體重可達200噸以上,甚至有些記錄顯示可以達到300噸。藍鯨是一種生活在海洋中的浮游生物食性動物,主要以磷蝦為食。藍鯨是地球上現存最大的動物,也是史上最大的動物之一。

運用 KernelArguments 提升 Prompt 彈性

接著讓我們再延伸一下範例,將 prompt 設計成簡單樣版格式,可以透過變數可以置換特定內容。例如:我們把"動物"變成一個可替換變數,可以讓上面應用層面更廣。

  • 建立 KernelArguments
    KernelArguments 的格式為 Key-Value 的字典格式配置。
KernelArguments arguments = new() { { "topic", "植物" } };
  • 使用 KernelArguments
    透過{{$變數名稱}},我們可以在 Prompt 中設置可替換的內容,這樣的機制讓我們能動態的調整 Prompt 的輸入。在呼叫 InvokePromptAsync 時,將實際的參數值傳入,Semantic Kernel 內部會自動為我們進行完整的 Prompt 處理,並將最終的結果交給 LLMs(大型語言模型)來進行生成。這種方式可以提高 Prompt 的彈性與可重用性。
Console.WriteLine(await kernel.InvokePromptAsync("世界最大的{{$topic}}是什麼?", arguments));

輸出的結果:
世界上最大的植物通常被認為是波多黎各的「海藻森林」(Posidonia oceanica),但如果考慮到單一個體的面積,則是美國俄勒岡州的「蜜蜂樹」(Pando),這是一個白楊樹(Populus tremuloides)的克隆群,估計有超過80,000棵樹,佔地約106公頃。
如果從高度來看,則加州的「紅杉樹」(Sequoiadendron giganteum)是已知的最高樹木之一,能達到超過100米。
因此,根據不同的標準,不同的植物可能會被視為「最大的植物」。

  • 使用多個 Prompt 變數
    若 Prompt 需要多個變數時,可以採用以下方式進行配置,延續範例,增加一個生成回應語系的變數。
KernelArguments arguments = new() { { "topic", "植物" }, { "lang", "英文" } };
Console.WriteLine(await kernel.InvokePromptAsync("世界最大的{{$topic}}是什麼? 請用{{$lang}}回答", arguments));
Console.WriteLine();

使用 Streaming 提升使用者體驗

我們都知道LLMs模型在生成回應需要一點時間,這個時間的長短會隨著使用者的提問複雜程度而增加,因此為了提升使用者體驗,Semantic Kernel 也支援 OpenAI 的 stream 回應方式。將原本的InvokePromptAsync改成呼叫 InvokePromptStreamingAsync,搭配迴圈進行回應的文字顯示。

使用 InvokePromptStreamingAsync

KernelArguments arguments = new() { { "topic", "植物" } };
await foreach (var result in kernel.InvokePromptStreamingAsync("世界最大的{{$topic}}是什麼?", arguments))
{
    Console.Write(result);
}
Console.WriteLine();

配置 LLMs 參數

以 OpenAI 的 GPT 模型為例,提供了部分可自訂的參數來進行配置,其中最常見的就是 temperature。temperature 的數值越高,模型的輸出就越具創意或「瘋狂」,反之,數值越低,模型則會更保守和「冷靜」。因此,Semantic Kernel 也提供了相應的機制來調整這些參數值。
不同的模型服務商所使用的設定檔和參數值會有所不同,以 OpenAI 為例,Semantic Kernel 提供了 OpenAIPromptExecutionSettings 物件,可以用來配置 OpenAI GPT 模型的參數。舉例來說,如果想要將最大 Tokens 設定為 200,temperature 設定為 0.3,便可以像以下這樣進行設定:

KernelArguments arguments = new(new OpenAIPromptExecutionSettings { MaxTokens = 200, Temperature = 0.3 }) { { "topic", "植物" } };
await foreach (var result in kernel.InvokePromptStreamingAsync("世界最大的{{$topic}}是什麼?", arguments))
{
    Console.Write(result);
}
Console.WriteLine();

如此一來就可以靈活的調整模型的輸出行為,根據不同需求場景進行微調。

結語

本篇內容利用簡單的範例,帶大家理解 Kernel 的用法與基本使用,如果你的使用情境相對單純,事實上只需要Kernel便可以快速整合到現有的應用,例如:摘要的應用,不涉及多回合的對話,只要使用KernelArguments 配合 Prompt,就能輕鬆做到。上一篇有提到 Semantic Kernel 也支援地端模型的連接,這部份我會在後續文章中做說明。


上一篇
你好 Semantic Kernel
下一篇
建立 Kernel 不同的寫法與 Role Prompt 的實現
系列文
Semantic Kernel 的魔力-用.NET探索生成式應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言